/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package tsb.grafo;

import tsb.dominio.conexiones.Conexion;
import tsb.dominio.dispositivos.Dispositivo;

/**
 *
 * @author Kapica
 */
import java.util.ArrayList;
import java.util.Iterator;

public class Grafo {

    private ArrayList<Dispositivo> arrayDispositivos;//Array de Dispositivos en el grafo
    private Matriz matriz =null;//guarda las conexiones

    public Grafo(Dispositivo nodo)
    {
        arrayDispositivos= new ArrayList<Dispositivo>();
        arrayDispositivos.add(nodo);
        matriz= new Matriz();
    }

    public ArrayList<Dispositivo> getArrayDispositivos() {
        return arrayDispositivos;
    }
    
    public Matriz getMatriz(){
        return this.matriz;
    }
   
    public boolean insertarNodo(Dispositivo nodo)
    {
        arrayDispositivos.add(nodo);
        if(matriz.aumentar())//aumentar en un indice la matriz
            return true;
        else
            return false;
    }
    /**
    * metodo para borrar nodo que no tengan conexion
     */

    public boolean eliminarNodo(Dispositivo nodo)
    {
      int indice=arrayDispositivos.indexOf(nodo);
      matriz.eliminarNodo(indice);

      if(arrayDispositivos.remove(nodo))
           return true;
      else
          return false;
    }
    
     /**
    * todos los dispositivos tienen un atributo que se llama nombre a mostrar.
      * Llega por parametro el nombre a mostrar y hay que eliminar ese nodo.
      * si ese nodo tiene conecciones hay que eliminar las conecciones tambien
     */
    public boolean eliminarNodo(String nombreAMostrar)
    {
        Iterator iter= this.arrayDispositivos.iterator();
        
        while(iter.hasNext())
        {
            Dispositivo d=(Dispositivo)iter.next();
            
            if(d.getNombreAMostrar().compareTo(nombreAMostrar)==0)
            {
                matriz.eliminarNodo(arrayDispositivos.indexOf(d));
                return arrayDispositivos.remove(d);
                
            }
        }
        
        return false;
    }




    /**primero averiguar en que indice estan los objetos de la conexion
     *segundo llamar al metodo agregar conexion en la clase matriz y pasarle la conexion y los indices
    **/
    public boolean insertarConexion(Conexion conec)
    {
      int posicionOrigen=arrayDispositivos.indexOf(conec.getOrigen());
      int posicionDestino=arrayDispositivos.indexOf(conec.getDestino());
      
      if(matriz.agregarConexion(conec,posicionOrigen,posicionDestino))
          return true;
      else
          return false;

    }
    public boolean eliminarConexion(Conexion conec)
    {
      int posicionOrigen=arrayDispositivos.indexOf(conec.getOrigen());
      int posicionDestino=arrayDispositivos.indexOf(conec.getDestino());
     if(matriz.eliminarConexion(posicionOrigen,posicionDestino))
         return true;
     else
         return false;

    }
    
    public boolean eliminarConexion(String nombreAMostrar)
    {
        return matriz.eliminarConexion(nombreAMostrar);
    }

    public Dispositivo getDispositivo(String nombreAMostrar)
    {
       Iterator iter= arrayDispositivos.iterator();
       while(iter.hasNext())
       {
           Dispositivo d= (Dispositivo)iter.next();
           if(d.getNombreAMostrar().compareTo(nombreAMostrar)==0)
           {
               return d;
           }
                   
       }
       return null;
    }
    public boolean actualizarDispositivo(Dispositivo disp)
    {
       boolean resultado=false;
       Iterator iter= arrayDispositivos.iterator();
       while(iter.hasNext())
       {
           Dispositivo d= (Dispositivo)iter.next();
           if(d.getNombreAMostrar().compareTo(disp.getNombreAMostrar())==0)
           {
               d=disp;
               resultado=true;
           }

       }
        return resultado;
    }

    public String toString()
    {
     Iterator iter= arrayDispositivos.iterator();
     String b="";
     while(iter.hasNext())
     {
        Dispositivo d=(Dispositivo)iter.next();
//        b.concat(d.toString());
        b=b+d.toString();
     }
     String a= matriz.toString();
     String aux= a+b;
     return aux;
    }


}
